package pe.com.bbva.modpre.ui;

import java.util.Iterator;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;

import pe.com.bbva.modpre.dominio.Lista;
import pe.com.bbva.modpre.dominio.TipoBanca;
import pe.com.bbva.modpre.dominio.TipoBancaTipoDoi;
import pe.com.bbva.modpre.dominio.TipoBancaTipoPlazo;
import pe.com.bbva.modpre.dominio.Valor;
import pe.com.bbva.modpre.exception.ValidacionException;
import pe.com.bbva.modpre.negocio.SolicitudService;
import pe.com.bbva.modpre.utileria.Constante;
import pe.com.bbva.modpre.utileria.Inject;

import com.vaadin.annotations.AutoGenerated;
import com.vaadin.data.Item;
import com.vaadin.data.util.BeanItemContainer;
import com.vaadin.data.util.IndexedContainer;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.ComboBox;
import com.vaadin.ui.CustomComponent;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.TabSheet;
import com.vaadin.ui.Table;
import com.vaadin.ui.VerticalLayout;

@SuppressWarnings("serial")
public class AdministrarTipoDoiTipoBancaUI extends CustomComponent implements ClickListener {

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	@AutoGenerated
	private VerticalLayout mainLayout;
	@AutoGenerated
	private HorizontalLayout mainLayoutContainer;
	@AutoGenerated
	private VerticalLayout layoutContainerVertical;
	@AutoGenerated
	private TabSheet tabBanca;
	@AutoGenerated
	private HorizontalLayout lytTipoPlazoBanca;
	@AutoGenerated
	private VerticalLayout lytPlazoMant;
	@AutoGenerated
	private HorizontalLayout lytBotonesPlazo;
	@AutoGenerated
	private Button btnEliminarPlazo;
	@AutoGenerated
	private Button btnAgregarPlazo;
	@AutoGenerated
	private ComboBox cmbPlazo;
	@AutoGenerated
	private Table tblPlazoxBanca;
	@AutoGenerated
	private HorizontalLayout lytTipoDoiBanca; 
	@AutoGenerated
	private VerticalLayout lytTipoDoiMant;
	@AutoGenerated
	private HorizontalLayout lytBotonesDoi;
	@AutoGenerated
	private Button btnEliminarDoi;
	@AutoGenerated
	private Button btnAgregarDoi;
	@AutoGenerated
	private ComboBox cmbTipoDoi;
	@AutoGenerated
	private Table tblDoixBanca;
	@AutoGenerated
	private ComboBox cmbTipoBanca;
	/**
	 * The constructor should first build the main layout, set the
	 * composition root and then do any custom initialization.
	 *
	 * The constructor will not be automatically regenerated by the
	 * visual editor.
	 */
	@Autowired
	SolicitudService solicitudService;
	IndexedContainer containerDoi = new IndexedContainer();
	IndexedContainer containerPlazo = new IndexedContainer();
	List<Valor> tipoDocumentos,tipoPlazos;
	Long idplazoElim,iddoiElim;
	public AdministrarTipoDoiTipoBancaUI() {
		buildMainLayout();
		setCompositionRoot(mainLayout);
		Inject.inject(this);
		postConstruct();
	}

	private void postConstruct() {
		tipoDocumentos=solicitudService.obtenerValoresxLista(Lista.CODIGO.TIPO_DOI);
		BeanItemContainer<Valor> bicTipoDocumentos = new BeanItemContainer<Valor>(Valor.class,  tipoDocumentos);
		cmbTipoDoi.setContainerDataSource(bicTipoDocumentos);
		cmbTipoDoi.setItemCaptionPropertyId("nombre");
		cmbTipoDoi.setInputPrompt("Tipo de Documento");
		cmbTipoDoi.setImmediate(true);
		cmbTipoDoi.setEnabled(false);
		cmbTipoDoi.addListener(new Listener() {
			
			@Override
			public void componentEvent(Event event) {
				if(cmbTipoDoi.getValue()==null){
					btnAgregarDoi.setEnabled(false);
					btnEliminarDoi.setEnabled(false);
				}else{
					btnAgregarDoi.setEnabled(true);
//					btnEliminarDoi.setEnabled(true);
				}
				
			}
		});
		
		List<TipoBanca> tipoBancas=solicitudService.buscarTipoBanca();
		BeanItemContainer<TipoBanca> bicTipoBancas = new BeanItemContainer<TipoBanca>(TipoBanca.class,  tipoBancas);
		cmbTipoBanca.setContainerDataSource(bicTipoBancas);
		cmbTipoBanca.setItemCaptionPropertyId("nombre");
		cmbTipoBanca.setInputPrompt("Tipo de Banca");
		cmbTipoBanca.setImmediate(true);
		
		Listener listener= new Listener() {
			
			@Override
			public void componentEvent(Event event) {
				// TODO Auto-generated method stub
				if(cmbTipoBanca.getValue()==null){
					cmbTipoDoi.setEnabled(false);
					cmbPlazo.setEnabled(false);
					cmbTipoDoi.setValue(null);
					cmbPlazo.setValue(null);
					tblDoixBanca.removeAllItems();
					tblPlazoxBanca.removeAllItems();
					btnAgregarDoi.setEnabled(false);
					btnAgregarPlazo.setEnabled(false);
					btnEliminarDoi.setEnabled(false);
					btnEliminarPlazo.setEnabled(false);
				}else{
					cmbTipoDoi.setEnabled(true);
					cmbPlazo.setEnabled(true);
					tblDoixBanca.removeAllItems();
					tblPlazoxBanca.removeAllItems();
					cargarDataTablaDoi((TipoBanca)cmbTipoBanca.getValue());
					cargarDataTablaPlazo((TipoBanca)cmbTipoBanca.getValue());
				}
				
			}

			
		};
		cmbTipoBanca.addListener(listener);
		
		tipoPlazos=solicitudService.obtenerValoresxLista(Lista.CODIGO.TIPO_PLAZO);
		BeanItemContainer<Valor> bicTipoPlazo = new BeanItemContainer<Valor>(Valor.class,  tipoPlazos);
		cmbPlazo.setContainerDataSource(bicTipoPlazo);
		cmbPlazo.setItemCaptionPropertyId("nombre");
		cmbPlazo.setInputPrompt("Tipo de Plazo");
		cmbPlazo.setEnabled(false);
		cmbPlazo.setImmediate(true);
		cmbPlazo.addListener(new Listener() {
			
			@Override
			public void componentEvent(Event event) {
				// TODO Auto-generated method stub
				if(cmbPlazo.getValue()==null){
					btnAgregarPlazo.setEnabled(false);
					btnEliminarPlazo.setEnabled(false);
				}else{
					btnAgregarPlazo.setEnabled(true);
//					btnEliminarPlazo.setEnabled(true);
				}
			}
		});
		
		cargarTabla();
		btnAgregarDoi.setEnabled(false);
		btnAgregarPlazo.setEnabled(false);
		btnEliminarDoi.setEnabled(false);
		btnEliminarPlazo.setEnabled(false);
		btnAgregarDoi.addListener(this);
		btnAgregarPlazo.addListener(this);
		btnEliminarDoi.addListener(this);
		btnEliminarPlazo.addListener(this);
	}
	
	private void cargarDataTablaDoi(TipoBanca tipoBanca) {
		List<TipoBancaTipoDoi> ListDoixBanca =solicitudService.obtenerDOIxBanca(tipoBanca);
		int con=1;
		for (TipoBancaTipoDoi tipoBancaDoi : ListDoixBanca) {
			Item item = containerDoi.addItem(con);
			item.getItemProperty("id").setValue(tipoBancaDoi.getId());
			item.getItemProperty("item").setValue(con);
			item.getItemProperty("tipoDOI").setValue(tipoBancaDoi.getTipoDoi().getNombre());
			con++;
			
		}
	}
	
	private void cargarDataTablaPlazo(TipoBanca tipoBanca){
		List<Valor> ListPlazoxBanca =solicitudService.obtenerPlazoxBanca(tipoBanca);
		int con=1;
		for (Valor tipoBancaPlaza : ListPlazoxBanca) {
			Item item = containerPlazo.addItem(con);
			item.getItemProperty("id").setValue(tipoBancaPlaza.getId());
			item.getItemProperty("item").setValue(con);
			item.getItemProperty("tipoPlazo").setValue(tipoBancaPlaza.getNombre());
			con++;
			
		}
	}
	
	public void cargarTabla() {
		
		containerDoi.addContainerProperty("id", Long.class,  null);
		containerDoi.addContainerProperty("item", String.class,  null);
		containerDoi.addContainerProperty("tipoDOI", String.class,  null);
		tblDoixBanca.setContainerDataSource(containerDoi);
		tblDoixBanca.setVisibleColumns(new Object[]{"item","tipoDOI"});
		tblDoixBanca.setColumnHeader("item", "Item");
		tblDoixBanca.setColumnHeader("tipoDOI", "Tipo DOI");
		tblDoixBanca.setColumnWidth("item", 30);
		tblDoixBanca.setColumnWidth("tipoDOI", 105);
		tblDoixBanca.setSelectable(true);
		tblDoixBanca.setImmediate(true);
		tblDoixBanca.addListener(new Listener() {
			
			@Override
			public void componentEvent(Event event) {
				if(tblDoixBanca.getValue() == null){
					btnEliminarDoi.setEnabled(false);
				}else{
					btnEliminarDoi.setEnabled(true);
					Item item = tblDoixBanca.getItem(tblDoixBanca.getValue());
					iddoiElim=(Long)item.getItemProperty("id").getValue();
				}
			}
		});
		
		containerPlazo.addContainerProperty("id", Long.class,  null);
		containerPlazo.addContainerProperty("item", String.class,  null);
		containerPlazo.addContainerProperty("tipoPlazo", String.class,  null);
		tblPlazoxBanca.setContainerDataSource(containerPlazo);
		tblPlazoxBanca.setVisibleColumns(new Object[]{"item","tipoPlazo"});
		tblPlazoxBanca.setColumnHeader("item", "Item");
		tblPlazoxBanca.setColumnHeader("tipoPlazo", "Tipo Plazo");
		tblPlazoxBanca.setColumnWidth("item", 30);
		tblPlazoxBanca.setColumnWidth("tipoPlazo", 105);
		tblPlazoxBanca.setSelectable(true);
		tblPlazoxBanca.setImmediate(true);
		tblPlazoxBanca.addListener(new Listener() {
			
			@Override
			public void componentEvent(Event event) {
				
				if(tblPlazoxBanca.getValue() == null){
					btnEliminarPlazo.setEnabled(false);
				}else{
					btnEliminarPlazo.setEnabled(true);
					Item item = tblPlazoxBanca.getItem(tblPlazoxBanca.getValue());
					idplazoElim=(Long)item.getItemProperty("id").getValue();
				}
			}
		});
	}

	@AutoGenerated
	private VerticalLayout buildMainLayout() {
		// common part: create layout
		mainLayout = new VerticalLayout();
		mainLayout.setImmediate(false);
		mainLayout.setWidth("100%");
		mainLayout.setHeight("100%");
		mainLayout.setMargin(false);
		
		// top-level component properties
		setWidth("100.0%");
		setHeight("100.0%");
		
		// mainLayoutContainer
		mainLayoutContainer = buildMainLayoutContainer();
		mainLayout.addComponent(mainLayoutContainer);
		
		return mainLayout;
	}

	@AutoGenerated
	private HorizontalLayout buildMainLayoutContainer() {
		// common part: create layout
		mainLayoutContainer = new HorizontalLayout();
		mainLayoutContainer.setImmediate(false);
		mainLayoutContainer.setWidth("-1px");
		mainLayoutContainer.setHeight("-1px");
		mainLayoutContainer.setMargin(true);
		
		// layoutContainerVertical
		layoutContainerVertical = buildLayoutContainerVertical();
		mainLayoutContainer.addComponent(layoutContainerVertical);
		
		return mainLayoutContainer;
	}

	@AutoGenerated
	private VerticalLayout buildLayoutContainerVertical() {
		// common part: create layout
		layoutContainerVertical = new VerticalLayout();
		layoutContainerVertical.setImmediate(false);
		layoutContainerVertical.setWidth("-1px");
		layoutContainerVertical.setHeight("-1px");
		layoutContainerVertical.setMargin(false);
		layoutContainerVertical.setSpacing(true);
		
		// cmbTipoBanca
		cmbTipoBanca = new ComboBox();
		cmbTipoBanca.setImmediate(false);
		cmbTipoBanca.setWidth("212px");
		cmbTipoBanca.setHeight("-1px");
		layoutContainerVertical.addComponent(cmbTipoBanca);
		layoutContainerVertical.setComponentAlignment(cmbTipoBanca,
				new Alignment(20));
		
		// tabBanca
		tabBanca = buildTabBanca();
		layoutContainerVertical.addComponent(tabBanca);
		
		return layoutContainerVertical;
	}

	@AutoGenerated
	private TabSheet buildTabBanca() {
		// common part: create layout
		tabBanca = new TabSheet();
		tabBanca.setImmediate(true);
		tabBanca.setWidth("-1px");
		tabBanca.setHeight("-1px");
		
		// lytTipoDoiBanca
		lytTipoDoiBanca = buildLytTipoDoiBanca();
		tabBanca.addTab(lytTipoDoiBanca, "Tipo Documento", null);
		
		// lytTipoPlazoBanca
		lytTipoPlazoBanca = buildLytTipoPlazoBanca();
		tabBanca.addTab(lytTipoPlazoBanca, "Tipo Plazo", null);
		
		return tabBanca;
	}

	@AutoGenerated
	private HorizontalLayout buildLytTipoDoiBanca() {
		// common part: create layout
		lytTipoDoiBanca = new HorizontalLayout();
		lytTipoDoiBanca.setImmediate(false);
		lytTipoDoiBanca.setWidth("-1px");
		lytTipoDoiBanca.setHeight("-1px");
		lytTipoDoiBanca.setMargin(false);
		lytTipoDoiBanca.setSpacing(true);
		
		// tblDoixBanca
		tblDoixBanca = new Table();
		tblDoixBanca.setImmediate(false);
		tblDoixBanca.setWidth("220px");
		tblDoixBanca.setHeight("229px");
		lytTipoDoiBanca.addComponent(tblDoixBanca);
		
		// lytTipoDoiMant
		lytTipoDoiMant = buildLytTipoDoiMant();
		lytTipoDoiBanca.addComponent(lytTipoDoiMant);
		
		return lytTipoDoiBanca;
	}

	@AutoGenerated
	private VerticalLayout buildLytTipoDoiMant() {
		// common part: create layout
		lytTipoDoiMant = new VerticalLayout();
		lytTipoDoiMant.setImmediate(false);
		lytTipoDoiMant.setWidth("-1px");
		lytTipoDoiMant.setHeight("-1px");
		lytTipoDoiMant.setMargin(false);
		lytTipoDoiMant.setSpacing(true);
		
		// cmbTipoDoi
		cmbTipoDoi = new ComboBox();
		cmbTipoDoi.setImmediate(false);
		cmbTipoDoi.setWidth("-1px");
		cmbTipoDoi.setHeight("-1px");
		lytTipoDoiMant.addComponent(cmbTipoDoi);
		
		// lytBotonesDoi
		lytBotonesDoi = buildLytBotonesDoi();
		lytTipoDoiMant.addComponent(lytBotonesDoi);
		lytTipoDoiMant.setComponentAlignment(lytBotonesDoi, new Alignment(20));
		
		return lytTipoDoiMant;
	}

	@AutoGenerated
	private HorizontalLayout buildLytBotonesDoi() {
		// common part: create layout
		lytBotonesDoi = new HorizontalLayout();
		lytBotonesDoi.setImmediate(false);
		lytBotonesDoi.setWidth("-1px");
		lytBotonesDoi.setHeight("-1px");
		lytBotonesDoi.setMargin(false);
		lytBotonesDoi.setSpacing(true);
		
		// btnAgregarDoi
		btnAgregarDoi = new Button();
		btnAgregarDoi.setCaption("Agregar");
		btnAgregarDoi.setImmediate(true);
		btnAgregarDoi.setWidth("-1px");
		btnAgregarDoi.setHeight("-1px");
		lytBotonesDoi.addComponent(btnAgregarDoi);
		
		// btnEliminarDoi
		btnEliminarDoi = new Button();
		btnEliminarDoi.setCaption("Eliminar");
		btnEliminarDoi.setImmediate(true);
		btnEliminarDoi.setWidth("-1px");
		btnEliminarDoi.setHeight("-1px");
		lytBotonesDoi.addComponent(btnEliminarDoi);
		
		return lytBotonesDoi;
	}

	@AutoGenerated
	private HorizontalLayout buildLytTipoPlazoBanca() {
		// common part: create layout
		lytTipoPlazoBanca = new HorizontalLayout();
		lytTipoPlazoBanca.setImmediate(false);
		lytTipoPlazoBanca.setWidth("-1px");
		lytTipoPlazoBanca.setHeight("-1px");
		lytTipoPlazoBanca.setMargin(false);
		lytTipoPlazoBanca.setSpacing(true);
		
		// tblPlazoxBanca
		tblPlazoxBanca = new Table();
		tblPlazoxBanca.setImmediate(false);
		tblPlazoxBanca.setWidth("220px");
		tblPlazoxBanca.setHeight("229px");
		lytTipoPlazoBanca.addComponent(tblPlazoxBanca);
		
		// lytPlazoMant
		lytPlazoMant = buildLytPlazoMant();
		lytTipoPlazoBanca.addComponent(lytPlazoMant);
		
		return lytTipoPlazoBanca;
	}

	@AutoGenerated
	private VerticalLayout buildLytPlazoMant() {
		// common part: create layout
		lytPlazoMant = new VerticalLayout();
		lytPlazoMant.setImmediate(false);
		lytPlazoMant.setWidth("-1px");
		lytPlazoMant.setHeight("-1px");
		lytPlazoMant.setMargin(false);
		lytPlazoMant.setSpacing(true);
		
		// cmbPlazo
		cmbPlazo = new ComboBox();
		cmbPlazo.setImmediate(false);
		cmbPlazo.setWidth("-1px");
		cmbPlazo.setHeight("-1px");
		lytPlazoMant.addComponent(cmbPlazo);
		
		// lytBotonesPlazo
		lytBotonesPlazo = buildLytBotonesPlazo();
		lytPlazoMant.addComponent(lytBotonesPlazo);
		lytPlazoMant.setComponentAlignment(lytBotonesPlazo, new Alignment(20));
		
		return lytPlazoMant;
	}

	@AutoGenerated
	private HorizontalLayout buildLytBotonesPlazo() {
		// common part: create layout
		lytBotonesPlazo = new HorizontalLayout();
		lytBotonesPlazo.setImmediate(false);
		lytBotonesPlazo.setWidth("-1px");
		lytBotonesPlazo.setHeight("-1px");
		lytBotonesPlazo.setMargin(false);
		lytBotonesPlazo.setSpacing(true);
		
		// btnAgregarPlazo
		btnAgregarPlazo = new Button();
		btnAgregarPlazo.setCaption("Agregar");
		btnAgregarPlazo.setImmediate(true);
		btnAgregarPlazo.setWidth("-1px");
		btnAgregarPlazo.setHeight("-1px");
		lytBotonesPlazo.addComponent(btnAgregarPlazo);
		
		// btnEliminarPlazo
		btnEliminarPlazo = new Button();
		btnEliminarPlazo.setCaption("Eliminar");
		btnEliminarPlazo.setImmediate(true);
		btnEliminarPlazo.setWidth("-1px");
		btnEliminarPlazo.setHeight("-1px");
		lytBotonesPlazo.addComponent(btnEliminarPlazo);
		
		return lytBotonesPlazo;
	}

	@Override
	public void buttonClick(ClickEvent event) {
		
		if(event.getButton().equals(btnAgregarDoi))
		{
			buttonGuardarDoi();
		}
		if(event.getButton().equals(btnEliminarDoi))
		{
			buttonEliminarDoi();
		}
		if(event.getButton().equals(btnAgregarPlazo))
		{
			buttonGuardarPlazo();
		}
		if(event.getButton().equals(btnEliminarPlazo))
		{
			buttonEliminarPlazo();
		}
	}

	private void buttonEliminarPlazo() {
		TipoBancaTipoPlazo tbp = new TipoBancaTipoPlazo();
		Valor tipoPlazo = new Valor();
		tipoPlazo.setId(idplazoElim);
		tbp.setTipoPlazo(tipoPlazo);
		solicitudService.eliminarTipoPlazaTipoBanca(tbp);
		tblPlazoxBanca.removeAllItems();
		cargarDataTablaPlazo((TipoBanca)cmbTipoBanca.getValue());
	}

	private void buttonEliminarDoi() {
		TipoBancaTipoDoi tbd=new TipoBancaTipoDoi();
		tbd.setId(iddoiElim);
		solicitudService.eliminarTipoDoiTipoBanca(tbd);
		tblDoixBanca.removeAllItems();
		cargarDataTablaDoi((TipoBanca)cmbTipoBanca.getValue());
	}

	private void buttonGuardarPlazo() {
		TipoBancaTipoPlazo plazaxBanca = new TipoBancaTipoPlazo();
		
		boolean bandera=true;
		for (Iterator<?> i = tblPlazoxBanca.getItemIds().iterator(); i.hasNext();) {
			int iid = (Integer) i.next();
			Item item = tblPlazoxBanca.getItem(iid);
			if((item.getItemProperty("tipoPlazo").getValue().toString()).equals(((Valor)cmbPlazo.getValue()).getNombre().toString())){
				bandera=false;
				break;
			}
		}
		if(bandera){
			//agregar
			plazaxBanca.setTipoBanca((TipoBanca)cmbTipoBanca.getValue());
			plazaxBanca.setTipoPlazo((Valor)cmbPlazo.getValue());
			plazaxBanca.setEstado(((TipoBanca)cmbTipoBanca.getValue()).getEstado());
			solicitudService.guardarTipoPlazaTipoBanca(plazaxBanca);
			tblPlazoxBanca.removeAllItems();
			cargarDataTablaPlazo((TipoBanca)cmbTipoBanca.getValue());
		}else{
			//alerta
			throw new ValidacionException(Constante.CODIGO_MENSAJE.VALIDAR_REPETIDO,new Object[]{});
			
		}
	}

	private void buttonGuardarDoi() {
		TipoBancaTipoDoi doixBanca = new TipoBancaTipoDoi();
		boolean bandera=true;
		for (Iterator<?> i = tblDoixBanca.getItemIds().iterator(); i.hasNext();) {
			int iid = (Integer) i.next();
			Item item = tblDoixBanca.getItem(iid);
			if((item.getItemProperty("tipoDOI").getValue().toString()).equals(((Valor)cmbTipoDoi.getValue()).getNombre().toString())){
				bandera=false;
				break;
			}
		}
		if(bandera){
			//agregar
			doixBanca.setTipoBanca((TipoBanca)cmbTipoBanca.getValue());
			doixBanca.setTipoDoi((Valor)cmbTipoDoi.getValue());
			doixBanca.setEstado(((TipoBanca)cmbTipoBanca.getValue()).getEstado());
			solicitudService.guardarTipoDoiTipoBanca(doixBanca);
			tblDoixBanca.removeAllItems();
			cargarDataTablaDoi((TipoBanca)cmbTipoBanca.getValue());
		}else{
			//alerta
			throw new ValidacionException(Constante.CODIGO_MENSAJE.VALIDAR_REPETIDO,new Object[]{});
			
		}
		
		
		
	}

}
